package dinucleotides;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

public final class TesteurCode {

	private Map<Character,Character> complementaires;
	
	public TesteurCode(Map<Character,Character> compl) {
		this.complementaires = compl;
	}
	
	public boolean isCodeCirculaire(Code code) {
		Collier collier = new Collier();
		List<String> codeDvp = code.getCodeTraduit();
		boolean isCirculaire = true;
		boolean collierFini = false;
		
		while(!collierFini) {
			if (collier.test(codeDvp)) {
				isCirculaire = false;
				break;
			}
			collierFini = !collier.next();
		}
		return isCirculaire;
	}
	
	public List<Code> supprimeCodesNonCirculaires(Set<Code> codes) {
		List<Code> res = new ArrayList<Code>();
		for (Code c : codes) {
			if (isCodeCirculaire(c)) {
				res.add(c);
			}
		}
		return res;
	}
	
	private String getComplementaire(String s) {
		StringBuffer res = new StringBuffer();
		for (int i = s.length()-1; i >=0; i--) {
			res.append(this.complementaires.get(s.charAt(i)));
		}
		return res.toString();
	}
	
	private boolean isCodeAutoCompl(Code c) {
		List<String> codeDvp = c.getCodeTraduit();
		boolean res = true;
		
		for (String mot : codeDvp) {
			if (!codeDvp.contains(getComplementaire(mot))) {
				//Un complémentaire n'y est pas
				res = false;
				break;
			}
		}
		
		return res;
	}

	public List<Code> supprimeCodesNonAutoCompl(List<Code> list) {
		List<Code> res = new ArrayList<Code>();
		for (Code c : list) {
			if (isCodeAutoCompl(c)) {
				res.add(c);
			}
		}
		return res;
	}
}